import PySimpleGUI as sg
from functools import wraps


def progress_bar(max_item: int):
    '''在批量创建文件夹时增加进度条效果'''
    
    def decorator(func):
        # 计数器，用于记录当前创建的文件夹数量
        row_index = 0
        layout = [
            [
                sg.Text(text='正在创建',
                        size=(15, 1),
                        font=('DengXian', 14),
                        key='—LABEL—')
            ],
            [
                sg.ProgressBar(max_value=max_item,
                                orientation='h',
                                size=(50, 20),
                                key='-BAR-')
            ],
            [sg.Cancel()]
        ]
        win_bar = sg.Window('任务完成进度', layout)
        
        # 保持被装饰函数的元信息：docstring，__name__
        @wraps(func)
        def _wrapper(*args, **kwargs):
            '''装饰器：在创建文件夹时显示一个进度条'''

            nonlocal row_index

            # 用户提前取消操作时，关闭窗口
            event, _ = win_bar.read(timeout=100)
            if event in (None, "Cancel", sg.WIN_CLOSED):
                win_bar.close()
                return

            row_index += 1
            # 更新进度条
            win_bar['-BAR-'].UpdateBar(row_index + 1)
            win_bar['—LABEL—'].update('正在创建 {} / {}'.format(row_index, max_item))

            # 执行创建目录的函数
            func(*args, **kwargs)

            # 创建完成，关闭窗口
            if row_index >= max_item:
                win_bar.close()

        return _wrapper

    return decorator